#include "./httplib.h"

using namespace std;
using namespace httplib;

// 根据哪一个业务请求，进行怎样的业务处理和业务响应
void Hello(const Request& req, Response& rsp)
{
    rsp.body = "Hello World!";
    rsp.status = 200; // 这个可以忽略，默认httplib会加上一个200的状态码
}

void Numbers(const Request& req, Response& rsp)
{
    // 捕捉的数字都会放在mathches里面
    // matches里面放的是正则表达式匹配的规则数据 /numbers/123 matches[0] = "/numbers/123", matches[1] = "123"
    string num = req.matches[1];
    rsp.set_content(num, "text/plain"); // 向rep.body里面添加数据，并且设置Content-Type类型
    rsp.status = 200;
}

void Multipart(const Request& req, Response& rsp)
{
    if (req.has_file("file1") == false)
    {
        rsp.status = 400;
        exit(-1);
    }
    MultipartFormData file = req.get_file_value("file1");
    cout << file.filename << endl; // 区域文件名称
    cout << file.content << endl;  // 区域文件内容
    rsp.status = 200;
}

int main()
{
    Server server;
    
    // 设置一个静态资源根目录 -- 为当前目录下的www目录
    server.set_mount_point("/", "./www");

    // 添加请求-处理函数映射信息
    server.Get("/hi", Hello);

    // 正则表达式中：\d表示数字，+表示匹配前面的字符一次或多次，()表示单独捕捉数据 /numbers/123才能匹配成功
    server.Get(R"(/numbers/(\d+))", Numbers);
    server.Post("/multipart", Multipart);

    // 开启服务器运行
    server.listen("0.0.0.0", 9090);

    return 0;
}